package com.ithuang.quartz.task;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

/**
 * 统计数量
 * 输出目录
 * 判断第一级子目录的时间
 */
// @Component
public class Task6 {

    @Autowired
    private JavaMailSender javaMailSender;

    public static void main(String[] args) throws IOException {
        // 指定要遍历的根目录
        String rootPath = "C:\\Users\\Administrator\\Documents\\jjjj - 副本";
        File rootFolder = new File(rootPath);

        // 给定时间（格式：yyyy-MM-dd HH:mm:ss）
        String givenTimeStr = "2025-03-21 21:03:00";
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date givenTime = null;
        try {
            givenTime = dateFormat.parse(givenTimeStr);
        } catch (ParseException e) {
            System.err.println("时间格式错误，请使用 yyyy-MM-dd HH:mm:ss 格式");
            return;
        }

        // 输出树形结构
        System.out.println("树形结构：");
        countNcFileTree(rootFolder, "", true, givenTime, "jjjj - 副本");
        
        printNcFile(rootFolder, "", true, givenTime, "jjjj - 副本");
    }

    /**
     * 递归遍历目录，输出树形结构并统计相似 .nc 文件的数量
     *
     * @param folder    当前文件夹
     * @param prefix    前缀（用于缩进和连接符号）
     * @param isLast    是否是父文件夹的最后一个子项
     * @param givenTime 给定的时间，只处理修改时间大于该时间的目录
     * @throws IOException 
     */
    public static void countNcFileTree(File folder, String prefix, boolean isLast, Date givenTime, String parentName) throws IOException {
        // 打印当前文件夹的名称
        System.out.println(prefix + (isLast ? "└── " : "├── ") + folder.getName());

        if (folder.isDirectory()) {
            // 获取文件夹下的所有文件和文件夹
            File[] files = folder.listFiles();
            if (files != null) {
                // 用于统计当前文件夹中的 .nc 文件
                Map<String, Integer> similarityMap = new HashMap<>();

                // 遍历文件和子文件夹
                for (int i = 0; i < files.length; i++) {
                    boolean isLastChild = (i == files.length - 1);
                    if (files[i].isDirectory()) {
                        // 如果是第一级子目录，检查修改时间  
                        String avsdf = files[i].getParentFile().getName();
                        if (avsdf.equalsIgnoreCase(parentName)) { // 根目录的子目录
                            long a = files[i].lastModified();
                            long b = givenTime.getTime();
                            // Date aa = new Date(a);
                            // Date bb = new Date(b);
                            if (a > b) {
                                // 如果修改时间大于给定时间，递归遍历
                                countNcFileTree(files[i], prefix + (isLast ? "    " : "│   "), isLastChild, givenTime, parentName);
                            }
                        } else {
                            // 如果不是第一级子目录，直接递归遍历
                            countNcFileTree(files[i], prefix + (isLast ? "    " : "│   "), isLastChild, givenTime, parentName);
                        }
                    } else if (files[i].isFile() && files[i].getName().endsWith(".nc")) {
                        // 如果是 .nc 文件，提取相似规则并统计
                        String similarityKey = extractSimilarityKey(files[i].getName());
                        similarityMap.put(similarityKey, similarityMap.getOrDefault(similarityKey, 0) + 1);
                    }
                }

                // 输出当前文件夹中的 .nc 文件统计结果
                for (Map.Entry<String, Integer> entry : similarityMap.entrySet()) {
                    System.out.println(prefix + (isLast ? "    " : "│   ") + (isLast ? "└── " : "├── ") + entry.getKey().replace("_正面", "") + "  ->  " + entry.getValue());
                }
            }
        }
    }

    /**
     * 提取文件名中的相似规则（去掉前面的数字部分）
     *
     * @param fileName 文件名
     * @return 相似规则
     */
    public static String extractSimilarityKey(String fileName) {
        // 找到第一个非数字字符的位置
        int index = 0;
        while (index < fileName.length() && Character.isDigit(fileName.charAt(index))) {
            index++;
        }
        // 返回去掉前面数字部分后的字符串
        return fileName.substring(index);
    }
    
    /**
     * 递归遍历目录，输出树形结构（只输出 .nc 文件）
     *
     * @param folder  当前文件夹
     * @param prefix  前缀（用于缩进和连接符号）
     * @param isLast  是否是父文件夹的最后一个子项
     */
    public static void printNcFile(File folder, String prefix, boolean isLast, Date givenTime, String parentName) {
        // 打印当前文件夹的名称
        System.out.println(prefix + (isLast ? "└── " : "├── ") + folder.getName());

        if (folder.isDirectory()) {
            // 获取文件夹下的所有文件和文件夹
            File[] files = folder.listFiles();
            if (files != null) {
                // 遍历文件和子文件夹
                for (int i = 0; i < files.length; i++) {
                    boolean isLastChild = (i == files.length - 1);
                    if (files[i].isDirectory()) {
                        // 如果是文件夹，递归遍历
                        // 如果是第一级子目录，检查修改时间  
                        String avsdf = files[i].getParentFile().getName();
                        if (avsdf.equalsIgnoreCase(parentName)) { // 根目录的子目录
                            long a = files[i].lastModified();
                            long b = givenTime.getTime();
                            // Date aa = new Date(a);
                            // Date bb = new Date(b);
                            if (a > b) {
                                printNcFile(files[i], prefix + (isLast ? "    " : "│   "), isLastChild, givenTime, parentName);
                            }
                        }else{
                            
                            printNcFile(files[i], prefix + (isLast ? "    " : "│   "), isLastChild, givenTime, parentName);
                        }
                    } else if (files[i].isFile() && files[i].getName().toLowerCase().endsWith(".nc")) {
                        // 如果是 .nc 文件，输出
                        System.out.println(prefix + (isLast ? "    " : "│   ") + (isLastChild ? "└── " : "├── ") + files[i].getName().replace("_正面", ""));
                    }
                }
            }
        }
    }

    public void handle() throws InterruptedException, MessagingException {
        Date date = new Date();
        System.out.println("task1"+date+"邮件");

        //true表示支持复杂类型
        MimeMessageHelper messageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(), true);
        //邮件发信人
        messageHelper.setFrom(new InternetAddress("“" + "<" + "" + ">"));
        //邮件收信人
        messageHelper.setTo("mingyang582@163.com");
        //邮件主题
        messageHelper.setSubject("subject");
        //邮件内容
        messageHelper.setText("content", "isHtml");
        //抄送
      
        
            messageHelper.setCc("抄送家伙");
      
            
       
                // messageHelper.addAttachment(file.getName(), file);
         
        // 邮件发送时间
        messageHelper.setSentDate(new Date());
        //正式发送邮件
        javaMailSender.send(messageHelper.getMimeMessage());
        
        System.out.println("task1"+date+"邮件结束");
    }
    void sss() {  

        // EmailDto emailDto = new EmailDto();
        // JavaMailSender mailSender= (JavaMailSender) ac.getBean("mailSender");  
        // MimeMessage message= mailSender.createMimeMessage();
        // message.setSubject("spring_mail"); // 邮件主题
        
        // // 创建带有附件的消息帮组类
        // MimeMessageHelper helper = new MimeMessageHelper(message,true,"utf-8"); helper.setTo(new InternetAddress("收件⼈的邮箱地址"));//设置接收⼈
        // helper.setText("Thank you for ordering!"); // 邮件内容
        // helper.setFrom("发件⼈的邮箱地址"); // 发件⼈
        
        // // 设置附件
        
        // File file = new File("C:\\work\\邮件附件.txt");
        
        // // 添加附件
        
        // helper.addAttachment(file.getName(), file);
        
        // // 发送邮件
        
        // mailSender.send(message);
 
    }
}
